package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.MenuDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.Menu;
import com.itheima.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service(interfaceClass = MenuService.class)
@Transactional
public class MenuServiceImpl implements MenuService {

    @Autowired
    private MenuDao menuDao;

    @Override
    public PageResult pageQuery(QueryPageBean queryPageBean) {
//        从queryPageBean对象取出值，当前页currentPage、查询条数pageSize、查询条件字符串queryString
        Integer currentPage = queryPageBean.getCurrentPage();
        Integer pageSize = queryPageBean.getPageSize();
        String queryString = queryPageBean.getQueryString();
//        完成分页查询，基于mybatis框架提供的分页助手插件完成
        PageHelper.startPage(currentPage,pageSize);
//        调用dao
        Page<Menu> page = menuDao.selectByCondition(queryString);
        long total = page.getTotal();
        List<Menu> rows = page.getResult();
        return new PageResult(total,rows);
    }

    @Override
    public void add(Menu menu) {
//        先添加菜单项
        menuDao.insertMenu(menu);
//        再添加Menu与Role的关联数据（向中间表Menu_Role添加）
        for (Integer roleId : menu.getRoleIds ()) {
            menuDao.insertRelOfMenuAndRole(roleId,menu.getId ());
        }
    }

    @Override
    public void delete(Integer id) {
//        先删除Menu与Role相关联的数据（向中间表Menu_Role添加）
        menuDao.deleteRelOfMenuAndRole(id);
//        再删除Menu数据
        menuDao.deleteMenu(id);
    }

    @Override
    public Menu findById(Integer id) {
//        根据id查询某个菜单项详情，返回给前台，进行数据回显
        Menu menu = menuDao.selectById(id);
        return menu;
    }

    @Override
    public void edit(Menu menu) {
//        修改菜单项
        menuDao.updateMenu(menu);
//        修改Menu与Role相关联的数据（对中间表Menu_Role修改）
//        注意：对于中间表的修改操作，实际上是，先根据菜单项Id删除菜单项对应关联数据，再重新添加新数据
        menuDao.deleteRelOfMenuAndRole (menu.getId ());
        for (Integer roleId : menu.getRoleIds ()) {
            menuDao.updateRelOfMenuAndRole(menu.getId (),roleId);
        }
    }

    @Override
    public List<Menu> findAll() {
        return menuDao.findAll();
    }
}
